package com.sanji.capture_audio.utils


import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.content.edit
import android.util.Log
import androidx.preference.PreferenceManager

/**
 * 应用程序偏好设置管理类
 * 
 * 用于管理应用的各种设置，包括启用状态、音频文件路径等
 */
class Preferences(private val context: Context) {
    companion object{
        // 常量類名
        private const val TAG = "Preferences"
        // 当前答录机的状态
        const val PREF_ENABLED = "enabled"
        // 当前开场音频文件路径键名
        const val PREF_OPENING_STATEMENT = "opening_statement"
        // 錄音功能是否啟用
        const val PREF_RECORDING_ENABLED = "recording_enabled"
        // 錄音文件保存路径
        const val PREF_RECORDING_OUTPUT_FILE = "recording_output_file"
    }

    // 獲取首選項
    private val prefs = PreferenceManager.getDefaultSharedPreferences(context)

    // 答錄機狀態
    var isEnabled: Boolean
        // isEnabled Getter/Setting方法 
        get() = prefs.getBoolean(PREF_ENABLED, false)
        set(enabled) {
            prefs.edit().putBoolean(PREF_ENABLED, enabled).apply()
            Log.d(TAG, "设置答录机状态: $enabled")
        }

    // 開場白語音文件
    var openingStatement: Uri?
        get() = prefs.getString(PREF_OPENING_STATEMENT, null)?.let { Uri.parse(it) }
        set(uri) {
            val oldUri = openingStatement
            // 如果新旧URI相同或都为null，则无需更新
            if (oldUri == uri) {
                // URI 与之前相同或者都为 null
                return
            }

            prefs.edit {
                if (uri != null) {
                    try {
                        // 首先为新的 URI 获取持久化权限
                        context.contentResolver.takePersistableUriPermission(
                            uri,
                            Intent.FLAG_GRANT_READ_URI_PERMISSION
                                or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                        )
                        // 保存新的 URI 字符串到偏好设置
                        putString(PREF_OPENING_STATEMENT, uri.toString())
                    } catch (e: SecurityException) {
                        // 如果无法获取持久化权限，仍然保存 URI，但不获取权限
                        // 这种情况常见于媒体库 URI
                        putString(PREF_OPENING_STATEMENT, uri.toString())
                        // 可以记录日志或进行其他处理
                    }
                } else {
                    // 如果 URI 为 null，则从偏好设置中移除该键
                    remove(PREF_OPENING_STATEMENT)
                }
            }

            // 只有在新 URI 设置成功后才释放旧 URI 的持久化权限，
            // 以确保操作的原子性，避免在权限转移过程中出现无权限访问的情况
            if (oldUri != null) {
                try {
                    context.contentResolver.releasePersistableUriPermission(
                        oldUri,
                        Intent.FLAG_GRANT_READ_URI_PERMISSION
                    )
                } catch (e: SecurityException) {
                    // 忽略权限释放失败的情况
                }
            }
        }
    
    // 錄音功能是否啟用
    var isRecordingEnabled: Boolean
        get() = prefs.getBoolean(PREF_RECORDING_ENABLED, false)
        set(value) = prefs.edit().putBoolean(PREF_RECORDING_ENABLED, value).apply()

    // 錄音文件保存路径
    var recordingOutputFile: Uri?
        get() {
            val path = prefs.getString(PREF_RECORDING_OUTPUT_FILE, null)
            return if (path != null) Uri.parse(path) else null
        }
        set(value) = prefs.edit().putString(PREF_RECORDING_OUTPUT_FILE, value?.toString()).apply()

}